﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Input;

namespace WpfControlDemo.ViewModels
{
    /// <summary>
    /// 控件的Command绑定命令
    /// </summary>
    public class RelayCommand : ICommand
    {
        /// <summary>
        /// 通知：当前按钮检查可用条件     触发 一次CanExecute
        /// 需要触发这个事件，才能触发检查条件委托
        /// </summary>
        public event EventHandler CanExecuteChanged
        {
            // 检测可能更改要执行的命令的功能的条件时发生-这里会强制执行
            // 用于解决当属性变化时通知页面控件是否可用。
            add { CommandManager.RequerySuggested += value; }
            remove { CommandManager.RequerySuggested -= value; }
        }
        /// <summary>
        /// 用于设置控件是否可用委托
        /// </summary>
        public Func<object, bool> canExecuteFunc;
        /// <summary>
        /// 按钮点击事件委托
        /// </summary>
        public Action<object> executeActions;

        #region 初始化
        /// <summary>
        /// 初始化
        /// </summary>
        /// <param name="execute"></param>
        public RelayCommand(Action<object> execute) : this(execute, null)
        {

        }

        /// <summary>
        /// 初始化
        /// </summary>
        /// <param name="execute">按钮点击事件委托</param>
        /// <param name="canExecute">用于设置控件是否可用委托</param>
        public RelayCommand(Action<object> execute, Func<object, bool> canExecute)
        {
            executeActions = execute; // 按钮点击事件委托
            canExecuteFunc = canExecute; // 用于设置控件是否可用委托
        }
        #endregion

        /// <summary>
        /// 用于命令是否可以执行方法
        /// </summary>
        /// <param name="parameter"></param>
        /// <returns></returns>
        public bool CanExecute(object parameter)
        {
            if (canExecuteFunc != null)
                return canExecuteFunc(parameter);
            return true;
        }

        /// <summary>
        /// 执行的操作   做什么
        /// </summary>
        /// <param name="parameter"></param>
        public void Execute(object parameter)
        {
            if (executeActions != null)
                executeActions(parameter);
        }

        /// <summary>
        /// 执行CanExecuteChanged事件
        /// </summary>
        public void OnCanExecuteChanged()
        {
            // 用于解决当属性变化时通知页面控件是否可用。
            //CanExecuteChanged?.Invoke(this, new EventArgs());
        }
    }
}
